import java.util.Calendar;


public class Event implements Comparable<Event>{

	/**Pole określające początek wydarzenia*/
	private Calendar eventStart;
	/**Pole określające koniec wydarzenia*/
	private Calendar eventEnd;
	/**Pole określające nazwę wydarzenia*/
	private String name;
	/**Pole określające lokalizację wydarzenia*/
	private String location;
	/**Pole określające opis wydarzenia*/
	private String description;
	/**Pole określające priorytet wydarzenia*/
	private int priority;
	/**Pole określające na ile minut przed wydarzeniem powinno nastąpić przypomnienie*/
	private int remind;
	/**Pole określające czy nastąpiło przypomnienie*/
	private boolean reminded;
	
	/**
	 * Tworzy obiekt klasy Event i inicjalizuje zmienne String pustym ciągiem znaków.
	 */
	public Event()
	{
		eventStart = Calendar.getInstance();
		eventEnd = Calendar.getInstance();
		setName("");
		setLocation("");
		setDescription("");
		setReminded(false);
	}
	/**
	 * Ustawia Datę początku wydarzenia.
	 * @param year Rok
	 * @param month Miesiąc
	 * @param date Dzień
	 * @param hour Godzina
	 * @param minute Minuta
	 */
	public void setEventStart(int year,int month, int date, int hour, int minute)
	{
		this.eventStart.set(year, month, date, hour, minute);
		eventStart.set(Calendar.SECOND,0);
		eventStart.set(Calendar.MILLISECOND, 0);
	}
	/**
	 * Zwraca datę początku wydarzenia.
	 * @return Data początku wydarzenia.
	 */
	public Calendar getEventStart()
	{
		return eventStart;
	}
	public int convertStartHour()	//konwertowanie godziny startu wydarzenia na indeks wiersza w modelu
	{
		int hour = 0;
		hour = 2*(this.eventStart.get(Calendar.HOUR_OF_DAY));
		if(this.eventStart.get(Calendar.MINUTE) == 30)
			hour = hour + 1;
		return hour;
	}
	public int convertEndHour()    //konwertowanie godziny konca wydarzenia na indeks wiersza w modelu
	{
		int hour = 0;
		hour = 2*(this.eventEnd.get(Calendar.HOUR_OF_DAY));
		if(this.eventEnd.get(Calendar.MINUTE) == 30)
			hour = hour + 1;
		return hour;
	}
	/**
	 * Ustawia Datę końca wydarzenia.
	 * @param year Rok
	 * @param month Miesiąc
	 * @param date Dzień
	 * @param hour Godzina
	 * @param minute Minuta
	 */
	public void setEventEnd(int year,int month, int date, int hour, int minute)
	{
		this.eventEnd.set(year, month, date, hour, minute);
		eventEnd.set(Calendar.SECOND,0);
		eventEnd.set(Calendar.MILLISECOND, 0);
	}
	/**
	 * Zwraca datę końca wydarzenia.
	 * @return Data końca wydarzenia.
	 */
	public Calendar getEventEnd()
	{
		return eventEnd;
	}
	/**
	 * Ustawia lokalizację wydarzenia
	 * @param location Łańcuch znaków oznaczający lokalizację.
	 */
	public void setLocation(String location) {
		this.location = location;
	}
/**
 * Zwraca lokalizację wydarzenia.
 * @return Łańcuch znaków oznaczający lokalizację.
 */
	public String getLocation() {
		return location;
	}
/**
 * Ustawia opis wydarzenia.
 * @param description Łańcuch znaków oznaczający opis wydarzenia
 */
	public void setDescription(String description) {
		this.description = description;
	}
/**
 * Zwraca opis wydarzenia.
 * @return Łańcuch znaków oznaczający opis wydarzenia
 */
	public String getDescription() {
		return description;
	}
/**
 * Ustawia priorytet wydarzenia
 * @param priority Liczba oznaczająca priorytet (0,2);
 */
	public void setPriority(int priority) {
		this.priority = priority;
	}
/**
 * Zwraca liczbę oznaczającą priorytet wydarzenia.
 * @return Liczba oznaczająca priorytet (0,2);
 */
	public int getPriority() {
		return priority;
	}
	/**
	 * Implementacja interfejsu comparable. Porównanie po lokacji.
	 */
	public int compareTo(Event o)		//porownanie po lokacji
	{
		return this.getLocation().compareTo(o.getLocation());
	}
/**
 * Ustawia na ile minut przed wydarzeniem ma nastąpić przypomnienie.
 * @param remind Ilość minut przed wydarzeniem.
 */
	public void setRemind(int remind) {
		this.remind = remind;
	}
/**
 * Zwraca na ile minut przed wydarzeniem ma nastąpić przypomnienie.
 * @return Ilość minut przed wydarzeniem.
 */
	public int getRemind() {
		return remind;
	}
	/**
	 * Zwraca reprezentację wydarzenia w postaci ciągu znaków.
	 */
	public String toString()
	{
		return "Podsumowanie: " + name + " ,Miejsce: " + location + " ,Opis: " + description + " ,Priorytet: " + priority + " ,Przypomnienie: " + remind;
	}
	
	public Calendar eventStartDate()	//funkcja potrzebna do porownania w Application.java
	{
		Calendar date = (Calendar)this.eventStart.clone();
		date.set(Calendar.HOUR_OF_DAY, 0);
		date.set(Calendar.MINUTE, 0);
		date.set(Calendar.SECOND, 0);
		date.set(Calendar.MILLISECOND, 0);
		return date;	
	}
	public Calendar eventEndDate()		//funkcja potrzebna do porownania w Application.java
	{
		Calendar date = (Calendar)this.eventEnd.clone();
		date.set(Calendar.HOUR_OF_DAY, 0);
		date.set(Calendar.MINUTE, 0);
		date.set(Calendar.SECOND, 0);
		date.set(Calendar.MILLISECOND, 0);
		return date;
	}
/**
 * Ustawia nazwę wydarzenia.
 * @param name Łańcuch znaków oznaczający nazwę wydarzenia.
 */
	public void setName(String name) {
		this.name = name;
	}
/**
 * Zwraca nazwę wydarzenia.
 * @return Łańcuch znaków oznaczający nazwę wydarzenia.
 */
	public String getName() {
		return name;
	}
/**
 * Ustawia flagę czy nastąpiło przypomnienie.
 * @param reminded true jeżeli przypomnienie nastąpiło.
 */
	public void setReminded(boolean reminded) {
		this.reminded = reminded;
	}
	/**
	 * Zwraca czy nastąpiło przypomnienie.
	 * @return true jeżeli nastąpiło, false jeżeli nie.
	 */
	public boolean isReminded() {
		return reminded;
	}
	
	public String startDateToICAL()
	{
		String month="";
		String ical="";
		switch(this.eventStart.get(Calendar.MONTH))
		{
			case 0: month="01"; break;
			case 1: month="02"; break;
			case 2: month="03"; break;
			case 3: month="04"; break;
			case 4: month="05"; break;
			case 5: month="06"; break;
			case 6: month="07"; break;
			case 7: month="08"; break;
			case 8: month="09"; break;
			case 9: month="10"; break;
			case 10: month="11"; break;
			case 11: month="12"; break;		
		}
		if(this.eventStart.get(Calendar.DATE)<10)
		{
			ical="DTSTART:"+this.eventStart.get(Calendar.YEAR)+month+"0"+this.eventStart.get(Calendar.DATE)+"T";
		}
		else
		{
			ical="DTSTART:"+this.eventStart.get(Calendar.YEAR)+month+this.eventStart.get(Calendar.DATE)+"T";
		}
		if(this.eventStart.get(Calendar.HOUR_OF_DAY)<10)
		{
			ical=ical+"0"+this.eventStart.get(Calendar.HOUR_OF_DAY);
		}
		else
		{
			ical=ical+this.eventStart.get(Calendar.HOUR_OF_DAY);
		}
		if(this.eventStart.get(Calendar.MINUTE)<10)
		{
			ical=ical+"0"+this.eventStart.get(Calendar.MINUTE)+"00"+"\n";
		}
		else
		{
			ical=ical+this.eventStart.get(Calendar.MINUTE)+"00"+"\n";
		}
		return ical;
	}
	
	public String endDateToICAL()
	{
		String month="";
		String ical="";
		switch(this.eventEnd.get(Calendar.MONTH))
		{
			case 0: month="01"; break;
			case 1: month="02"; break;
			case 2: month="03"; break;
			case 3: month="04"; break;
			case 4: month="05"; break;
			case 5: month="06"; break;
			case 6: month="07"; break;
			case 7: month="08"; break;
			case 8: month="09"; break;
			case 9: month="10"; break;
			case 10: month="11"; break;
			case 11: month="12"; break;		
		}
	
		if(this.eventEnd.get(Calendar.DATE)<10)
		{
			ical="DTEND:"+this.eventEnd.get(Calendar.YEAR)+month+"0"+this.eventEnd.get(Calendar.DATE)+"T";
		}
		else
		{
			ical="DTEND:"+this.eventEnd.get(Calendar.YEAR)+month+this.eventEnd.get(Calendar.DATE)+"T";
		}
		if(this.eventEnd.get(Calendar.HOUR_OF_DAY)<10)
		{
			ical=ical+"0"+this.eventEnd.get(Calendar.HOUR_OF_DAY);
		}
		else
		{
			ical=ical+this.eventEnd.get(Calendar.HOUR_OF_DAY);
		}
		if(this.eventEnd.get(Calendar.MINUTE)<10)
		{
			ical=ical+"0"+this.eventEnd.get(Calendar.MINUTE)+"00"+"\n";
		}
		else
		{
			ical=ical+this.eventEnd.get(Calendar.MINUTE)+"00"+"\n";
		}
		return ical;
	}
}
